package cn.com.shinho.hg.core.base.request;

import cn.com.shinho.hg.core.util.JsonUtil;
import com.fasterxml.jackson.databind.ObjectMapper;

import java.io.Serializable;
import java.util.List;

/**
 * 响应结果封装
 *
 * @author fengshuonan
 * @Date 2018/2/11 23:04
 */
public class RequestData implements Serializable {

    private static final long serialVersionUID = 9081406366569775542L;

    /**
     * 封装前端请求的json数据
     */
    private String data;

    /**
     * 请求号,标识请求的唯一性,用来定位多个服务调用链的日志记录
     */
    private String requestNo;

    /**
     * 客户端请求的ip
     */
    private String ip;

    /**
     * 客户端请求的地址
     */
    private String url;

    /**
     * 获取请求原始json
     */
    public String getData() {
        return data;
    }

    public void setData(String data) {
        this.data = data;
    }

    /**
     * 解析请求json为指定类
     */
    public <T> T parse(Class<T> clazz) {
        return JsonUtil.toObject(data,clazz);
    }

    /**
     * 解析请求json中指定key,并转化为指定类
     */
    public <T> T parse(String key, Class<T> clazz) {
        ObjectMapper o = new ObjectMapper();
        List<T> list = JsonUtil.toObjectByKey(data,clazz,key);
        return list.get(0);
    }





    /**
     * 解析指定key,转化为带有类类型的list
     */
    public <T> List<T> getList(String key, Class<T> clazz) {
       return  JsonUtil.toObjectByKey(data,clazz,key);
    }



//    /**
//     * 获取指定key对应的值
//     */
//    public Object get(String key) {
//
//        return this.data.get(key);
//    }
//
//    /**
//     * 获取指定key对应的string值
//     */
//    public String getString(String key) {
//        return this.data.getString(key);
//    }
//
//    /**
//     * 获取指定key对应的integer值
//     */
//    public Integer getInteger(String key) {
//        return this.data.getInteger(key);
//    }
//
//    /**
//     * 解析请求数据抓华为map
//     */
//    public Map<String, Object> parseMap() {
//        return this.jsonObjet2Map(this.data);
//    }
//
//    private Map<String, Object> jsonObjet2Map(JSONObject jsonObj) {
//        Map<String, Object> map = new HashMap();
//        Set<Map.Entry<String, Object>> entries = jsonObj.getInnerMap().entrySet();
//        Iterator<Map.Entry<String, Object>> itera = entries.iterator();
//        Map.Entry<String, Object> entry = null;
//        Object value = null;
//        while (itera.hasNext()) {
//            entry = itera.next();
//            value = entry.getValue();
//            map.put(entry.getKey(), traversalData(value));
//        }
//        return map;
//    }
//
//    private Object jsonArray2List(JSONArray array) {
//        List<Object> list = new ArrayList<>();
//        Iterator<Object> itera = array.iterator();
//        Object value;
//        while (itera.hasNext()) {
//            value = itera.next();
//            list.add(traversalData(value));
//        }
//        return list;
//    }
//
//    private Object traversalData(Object value) {
//        if (value instanceof JSONObject) {
//            return this.jsonObjet2Map((JSONObject) value);
//        } else if (value instanceof JSONArray) {
//            return this.jsonArray2List((JSONArray) value);
//        } else {
//            return value;
//        }
//    }

    public String getRequestNo() {
        return requestNo;
    }

    public void setRequestNo(String requestNo) {
        this.requestNo = requestNo;
    }

    public String getIp() {
        return ip;
    }

    public void setIp(String ip) {
        this.ip = ip;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    @Override
    public String toString() {
        return "RequestData{" +
                "data=" + data +
                ", requestNo='" + requestNo + '\'' +
                ", ip='" + ip + '\'' +
                ", url='" + url + '\'' +
                '}';
    }
}
